/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package org.ugc.cnel.manabi.bakenbeans;

import com.icesoft.faces.component.ext.HtmlInputText;
import com.icesoft.faces.component.ext.HtmlInputTextarea;
import com.icesoft.faces.component.ext.HtmlSelectOneMenu;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;
import java.util.logging.Level;
import java.util.logging.Logger;
import javax.faces.application.FacesMessage;
import javax.faces.component.UIComponent;
import javax.faces.component.UIInput;
import javax.faces.context.FacesContext;
import javax.faces.event.AbortProcessingException;
import javax.faces.event.ActionEvent;
import javax.faces.event.ActionListener;
import org.ugc.cnel.manabi.entidades.Ciudad;
import org.ugc.cnel.manabi.entidades.Cliente;
import org.ugc.cnel.manabi.entidades.Inspeccion;
import org.ugc.cnel.manabi.entidades.Servicio;
import org.ugc.cnel.manabi.jpa.CiudadJpaController;
import org.ugc.cnel.manabi.jpa.ClienteJpaController;
import org.ugc.cnel.manabi.jpa.exceptions.IllegalOrphanException;
import org.ugc.cnel.manabi.jpa.exceptions.NonexistentEntityException;
import org.ugc.cnel.manabi.jpa.exceptions.PreexistingEntityException;

/**
 *
 * @author Admin
 */
public class clientesBakenBean {

    private HtmlInputText txt_cedularuc = null;
    private HtmlInputText txt_nombre_cliente = null;
    private HtmlInputText txt_nombre_local = null;
    private HtmlInputTextarea txt_direccion = null;
    private HtmlSelectOneMenu cmb_ciudad = null;
    private String cedularuc = "";
    private String local_dir = "";
    private String nombre_cliente = "";
    private eventosBakenBean poppup = null;
    private navegacionBakenBean nav = null;
    private List lista_clientes = null;
    private String ciudad = "";
    private int cod_ciudad;
    private ClienteJpaController clijpa = null;
    private boolean edit = false;
    private boolean delete = false;
    private Cliente selectdCliente = null;
    private final CiudadJpaController ciujpa;

    public Cliente getSelectdCliente() {
        return selectdCliente;
    }

    public void setSelectdCliente(Cliente selectdCliente) {
        this.selectdCliente = selectdCliente;
    }

    public boolean isDelete() {
        return delete;
    }

    public void setDelete(boolean delete) {
        this.delete = delete;
    }

    public boolean isEdit() {
        return edit;
    }

    public void setEdit(boolean edit) {
        this.edit = edit;
    }

    public eventosBakenBean getPoppup() {
        return poppup;
    }

    public void setPoppup(eventosBakenBean poppup) {
        this.poppup = poppup;
    }

    public List getLista_clientes() {
        return lista_clientes;
    }

    public HtmlInputText getTxt_nombre_local() {
        return txt_nombre_local;
    }

    public void setTxt_nombre_local(HtmlInputText txt_nombre_local) {
        this.txt_nombre_local = txt_nombre_local;
    }

    public String getLocal_dir() {
        return local_dir.toUpperCase();
    }

    public void setLocal_dir(String local_dir) {
        this.local_dir = local_dir.toUpperCase();
    }

    public void setLista_clientes(List lista_clientes) {
        this.lista_clientes = lista_clientes;
    }

    public String getNombre_cliente() {
        return nombre_cliente.toUpperCase();
    }

    public void setNombre_cliente(String nombre_cliente) {
        this.nombre_cliente = nombre_cliente.toUpperCase();
    }

    public HtmlInputText getTxt_nombre_cliente() {
        return txt_nombre_cliente;
    }

    public void setTxt_nombre_cliente(HtmlInputText txt_nombre_cliente) {
        this.txt_nombre_cliente = txt_nombre_cliente;
    }

    public HtmlSelectOneMenu getCmb_ciudad() {
        return cmb_ciudad;
    }

    public void setCmb_ciudad(HtmlSelectOneMenu cmb_ciudad) {
        this.cmb_ciudad = cmb_ciudad;
    }

    public navegacionBakenBean getNav() {
        return nav;
    }

    public void setNav(navegacionBakenBean nav) {
        this.nav = nav;
    }

    public HtmlInputTextarea getTxt_direccion() {
        return txt_direccion;
    }

    public void setTxt_direccion(HtmlInputTextarea txt_direccion) {
        this.txt_direccion = txt_direccion;
    }

    public int getCod_ciudad() {
        return cod_ciudad;
    }

    public void setCod_ciudad(int cod_ciudad) {
        this.cod_ciudad = cod_ciudad;
    }
    private String direccion = "";

    public String getDireccion() {
        return direccion;
    }

    public void setDireccion(String direccion) {
        this.direccion = direccion;
    }

    public String getCiudad() {
        return ciudad;
    }

    public void setCiudad(String ciudad) {
        this.ciudad = ciudad;
    }
    private Ciudad ciudades = null;

    public Ciudad getCiudades() {
        return ciudades;
    }

    public void setCiudades(Ciudad ciudades) {
        this.ciudades = ciudades;
    }

    public String getCedularuc() {
        focus();
        return cedularuc;
    }

    public void setCedularuc(String cedularuc) {
        focus();
        this.cedularuc = cedularuc;
    }

    public HtmlInputText getTxt_cedularuc() {
        return txt_cedularuc;
    }

    public void setTxt_cedularuc(HtmlInputText txt_cedularuc) {
        this.txt_cedularuc = txt_cedularuc;
    }

    /** Creates a new instance of clientesBakenBean */
    public clientesBakenBean() {
        ciujpa = new CiudadJpaController();
        FacesContext facesContext = FacesContext.getCurrentInstance();
        clijpa = (ClienteJpaController) facesContext.getApplication().getELResolver().getValue(facesContext.getELContext(), null, "ClienteJPA");
        actualiza_lista();
    }

    private void actualiza_lista() {
        List<Object> lista_obj = new ArrayList();
        List<Cliente> cli = clijpa.findClienteEntities();
        for (Cliente cliente : cli) {
            lista_obj.add(new Object[]{cliente, ciujpa.findCiudad(cliente.getIdCiudad())});
        }
        setLista_clientes(lista_obj);
    }

    public void validaCedula(FacesContext context, UIComponent validate, Object value) {
        String cedula = (String) value;
        if (cedula.length() < 10) {
            ((UIInput) validate).setValid(false);
            FacesMessage msg = new FacesMessage("Cedula o RUC Incorrecto");
            context.addMessage(validate.getClientId(context), msg);
            txt_cedularuc.requestFocus();
            return;
        }
        if (!cedula.matches("^\\d+$")) {
            ((UIInput) validate).setValid(false);
            FacesMessage msg = new FacesMessage("Cedula o RUC debe contener solo numeros");
            context.addMessage(validate.getClientId(context), msg);
            txt_cedularuc.requestFocus();
            return;
        }
    }

    public void guardar(ActionEvent evt) {
        try {
            Cliente cliente = new Cliente(0, getNombre_cliente(), getLocal_dir(), getDireccion(), getCedularuc(), new Date());

            FacesContext facesContext = FacesContext.getCurrentInstance();
            CiudadJpaController cuidad_con = (CiudadJpaController) facesContext.getApplication().getELResolver().getValue(facesContext.getELContext(), null, "CiudadJPA");

            Ciudad ciudad_save = cuidad_con.findCiudad(getCod_ciudad());
            cliente.setIdCiudad(ciudad_save.getId());
            cliente.setFechaRegistro(new Date());

            if (!isEdit()) {
                cliente.setInspeccionCollection(new ArrayList<Inspeccion>());
                cliente.setServicioCollection(new ArrayList<Servicio>());
                clijpa.create(cliente);
            } else {
                if (getSelectdCliente() != null) {
                    cliente.setId(getSelectdCliente().getId());
                    cliente.setServicioCollection(getSelectdCliente().getServicioCollection());
                    cliente.setInspeccionCollection(getSelectdCliente().getInspeccionCollection());
                    clijpa.edit(cliente);
                    setEdit(false);
                }
            }
            actualiza_lista();
            limpiar_form();
            getPoppup().setTipo_ventana(eventosBakenBean.CERRAR);
            getPoppup().setPopup_header("Informacion");
            getPoppup().setPopup_conten(isEdit() ? "Cliente Modificado Correctamente" : "Cliente Guardado con Exito");
            getPoppup().setPopup_visible(true);

        } catch (PreexistingEntityException ex) {
            getPoppup().setTipo_ventana(eventosBakenBean.CERRAR);
            getPoppup().setPopup_header("Error al Guardar PE");
            getPoppup().setPopup_conten(ex.getMessage());
            getPoppup().setPopup_visible(true);
            Logger.getLogger(clientesBakenBean.class.getName()).log(Level.SEVERE, null, ex);
        } catch (Exception ex) {
            getPoppup().setTipo_ventana(eventosBakenBean.CERRAR);
            getPoppup().setPopup_header("Error al Guardar");
            getPoppup().setPopup_conten("La cedula ya esta ingresada");
            getPoppup().setPopup_visible(true);
            Logger.getLogger(clientesBakenBean.class.getName()).log(Level.SEVERE, null, ex);
        }
        return;
    }

    public void editar(ActionEvent evt) {
        Cliente row_cliente = (Cliente) evt.getComponent().getAttributes().get("idfila");
        if (row_cliente != null) {
            load_data_cliente(row_cliente);
            setSelectdCliente(row_cliente);
            setEdit(true);
        }
    }

    public void borrar(ActionEvent evt) {
        Cliente row_cliente = (Cliente) evt.getComponent().getAttributes().get("idfila");
        if (row_cliente != null) {
            setSelectdCliente(row_cliente);
            getPoppup().setPopup_header("Advertencia");
            getPoppup().setPopup_conten("¿Desea Eliminar el Registro?");
            getPoppup().setTipo_ventana(eventosBakenBean.ACEPTAR_CANCELAR);
            getPoppup().setPopup_visible(true);
            // Agregar el ActionListener en caso que el boton aceptar sea presionado no se si esta bien pero creo que funciona
            getPoppup().limpiar_listener();
            getPoppup().getBtn_1().addActionListener(new ActionListener() {

                public void processAction(ActionEvent arg0) throws AbortProcessingException {
                    getSelectdCliente().setBorrado(true);
                    try {
                        clijpa.edit(getSelectdCliente());
                        setLista_clientes(clijpa.findClienteEntities());
                    } catch (IllegalOrphanException ex) {
                        getPoppup().setTipo_ventana(eventosBakenBean.CERRAR);
                        getPoppup().setPopup_header("Error al Guardar");
                        getPoppup().setPopup_conten(ex.getMessage());
                        getPoppup().setPopup_visible(true);
                        Logger.getLogger(clientesBakenBean.class.getName()).log(Level.SEVERE, null, ex);
                    } catch (NonexistentEntityException ex) {
                        getPoppup().setTipo_ventana(eventosBakenBean.CERRAR);
                        getPoppup().setPopup_header("Error al Guardar");
                        getPoppup().setPopup_conten(ex.getMessage());
                        getPoppup().setPopup_visible(true);
                        Logger.getLogger(clientesBakenBean.class.getName()).log(Level.SEVERE, null, ex);
                    } catch (Exception ex) {
                        getPoppup().setTipo_ventana(eventosBakenBean.CERRAR);
                        getPoppup().setPopup_header("Error al Guardar");
                        getPoppup().setPopup_conten(ex.getMessage());
                        getPoppup().setPopup_visible(true);
                        Logger.getLogger(clientesBakenBean.class.getName()).log(Level.SEVERE, null, ex);
                    }
                }
            });

        }
    }

    public void cancelar(ActionEvent evt) {
        limpiar_form();
        //focus();
        // Redireccionar a la Pagina de contenido
        getNav().setPagina_contenido("indicadores/indicadores.jspx");
    }

    private void limpiar_form() {
        setCedularuc("");
        txt_cedularuc.setSubmittedValue("");
        setNombre_cliente("");
        txt_nombre_cliente.setSubmittedValue("");
        setLocal_dir("");
        txt_nombre_local.setSubmittedValue("");
        setDireccion("");
        txt_direccion.setSubmittedValue("");
        setCod_ciudad(0);
        cmb_ciudad.setSubmittedValue("");
    }

    private void load_data_cliente(Cliente cliente) {
        setCedularuc(cliente.getCedularuc());
        txt_cedularuc.setSubmittedValue(cliente.getCedularuc());
        setNombre_cliente(cliente.getNombre());
        txt_nombre_cliente.setSubmittedValue(cliente.getNombre());
        setLocal_dir(cliente.getLocalDir());
        txt_nombre_local.setSubmittedValue(cliente.getLocalDir());
        setDireccion(cliente.getDireccion());
        txt_direccion.setSubmittedValue(cliente.getDireccion());
        setCod_ciudad(cliente.getIdCiudad());

        cmb_ciudad.setSubmittedValue(ciujpa.findCiudad(cliente.getIdCiudad()).getNombre());
        cmb_ciudad.setValue(cliente.getIdCiudad());
        cmb_ciudad.updateModel(FacesContext.getCurrentInstance());
        getTxt_cedularuc().requestFocus();
    }

    private void focus() {
//        if (txt_cedularuc != null) {
//            txt_cedularuc.requestFocus();
//        }
    }
}
